package com.yyge;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.MultimapBuilder;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 简单理解：具有聚合组的ArrayList 类似stream流groupingBy之后的效果
 * Multimap通常来说就是类似于Map<K, List<V>>或者Map<K, Set<V>>，
 * 与Map不同的是，Multimap可以存放相同key的value值，并且将相同key的value值存放在集合中，我们可以这样理解Multimap：
 *   存放：
 *   a -> 1
 *   a -> 2
 *   a -> 4
 *   b -> 3
 *   c -> 5
 *   结果：
 *   a -> [1, 2, 4]
 *   b -> [3]
 *   c -> [5]
 *
 *   Multimap 实现类
 *   -- ArrayListMultimap       HashMap         ArrayList
 *   -- HashMultimap            HashMap         HashSet
 *   -- LinkedListMultimap      LinkedHashMap	LinkedList
 *   -- LinkedHashMultimap      LinkedHashMap	LinkedHashMap
 *   -- TreeMultimap            TreeMap         TreeSet
 *   -- ImmutableListMultimap	ImmutableMap	ImmutableList
 *   -- ImmutableSetMultimap	ImmutableMap	ImmutableSet
 */
public class MultimapTest {
    public static void main(String[] args) {
        // ListMultimap
        ListMultimap<String, Integer> treeListMultimap = MultimapBuilder.treeKeys().arrayListValues().build();

        // 直接创建
        Multimap<String,Integer> multimap = ArrayListMultimap.create();
        multimap.put("a",1);
        multimap.put("a",2);
        multimap.put("a",2);
        multimap.put("b",3);
        multimap.put("b",4);
        System.out.println(multimap); // {a=[1, 2, 2], b=[3, 4]}


        // 转为map ：Map<K, Collection<V>>
        Map<String, Collection<Integer>> map = multimap.asMap();

        // 返回一个集合
        Collection<Integer> a = multimap.get("a"); //{a=[1, 2, 2], b=[3, 4]}

        // 所有value生成一个集合
        Collection<Integer> values = multimap.values();

        // 是否包含
        System.out.println(multimap.containsKey("a")); //true
    }
}
